/*
 * @Descripttion: nacos 配置
 * 参考: https://gitee.com/chenfyu/beego/blob/develop/core/config/yaml/yaml.go
 * https://goframe.org/pages/viewpage.action?pageId=59864389
 * @version:
 * @Author: lfzxs@qq.com
 * @Date: 2022-11-18 14:17:50
 * @LastEditors: lfzxs@qq.com
 * @LastEditTime: 2022-11-25 15:47:09
 */
package cfg

import (
	"github.com/nacos-group/nacos-sdk-go/clients"
	"github.com/nacos-group/nacos-sdk-go/common/constant"
	"github.com/nacos-group/nacos-sdk-go/vo"
)

type nacosCfg struct {
	YmlCfg

	//ServerConfig
	ContextPath string // Nacos的ContextPath，默认/nacos，在2.0中不需要设置
	IpAddr      string // Nacos的服务地址
	Port        uint64 // Nacos的服务端口
	Scheme      string // Nacos的服务地址前缀，默认http，在2.0中不需要设置

	//ClientConfig
	TimeoutMs   uint64 // 请求Nacos服务端的超时时间，默认是10000ms
	NamespaceId string // ACM的命名空间Id
	Endpoint    string // 当使用ACM时，需要该配置. https://help.aliyun.com/document_detail/130146.html
	RegionId    string // ACM&KMS的regionId，用于配置中心的鉴权
	AccessKey   string // ACM&KMS的AccessKey，用于配置中心的鉴权
	SecretKey   string // ACM&KMS的SecretKey，用于配置中心的鉴权
	OpenKMS     bool   // 是否开启kms，默认不开启，kms可以参考文档 https://help.aliyun.com/product/28933.html
	// 同时DataId必须以"cipher-"作为前缀才会启动加解密逻辑
	CacheDir             string // 缓存service信息的目录，默认是当前运行目录
	UpdateThreadNum      int    // 监听service变化的并发数，默认20
	NotLoadCacheAtStart  bool   // 在启动的时候不读取缓存在CacheDir的service信息
	UpdateCacheWhenEmpty bool   // 当service返回的实例列表为空时，不更新缓存，用于推空保护
	Username             string // Nacos服务端的API鉴权Username
	Password             string // Nacos服务端的API鉴权Password
	LogDir               string // 日志存储路径
	RotateTime           string // 日志轮转周期，比如：30m, 1h, 24h, 默认是24h
	MaxAge               int64  // 日志最大文件数，默认3
	LogLevel             string // 日志默认级别，值必须是：debug,info,warn,error，默认值是info

	DataId string
	Group  string
}

func CreateNacosCfg(cfg *nacosCfg) (err error) {

	//创建nacos连接配置
	sc := []constant.ServerConfig{{
		IpAddr:      cfg.IpAddr,
		Port:        cfg.Port,
		Scheme:      cfg.Scheme,
		ContextPath: cfg.ContextPath,
	}}

	cc := constant.ClientConfig{
		NamespaceId:         cfg.NamespaceId,
		TimeoutMs:           cfg.TimeoutMs,
		NotLoadCacheAtStart: cfg.NotLoadCacheAtStart,
		LogDir:              cfg.LogDir,
		CacheDir:            cfg.CacheDir,
		LogLevel:            cfg.LogLevel,
		Username:            cfg.Username,
		Password:            cfg.Password,
		AccessKey:           cfg.AccessKey,
		SecretKey:           cfg.SecretKey,
	}

	//创建连接
	configClient, err := clients.CreateConfigClient(map[string]interface{}{
		"serverConfigs": sc,
		"clientConfig":  cc,
	})

	if err != nil {
		panic(err)
	}
	//获取指定配置文件
	content, err := configClient.GetConfig(vo.ConfigParam{
		DataId: cfg.DataId,
		Group:  cfg.Group,
	})

	if err != nil {
		panic(err)
	}

	var data []byte = []byte(content)

	cfg.LoadData(data)

	return
}
